package utna.frba.ia.tp.cases.descifrador.reglas.impl;

import java.util.ArrayList;
import java.util.regex.Pattern;

import utna.frba.ia.tp.cases.descifrador.reglas.definition.Funcion;

public class Regla15 implements Funcion{
	
	@Override
	public double valueOf(String key) {
		return puntajePorNumerosContenidos(key);
	}
	
	private double puntajePorNumerosContenidos(String key) {
		double toReturn = 0;
		
		toReturn += this.ifMatchsGet("2|1|0",key,20);
		toReturn -= this.ifDontMatchsGet("2|1|0", key, 80);
		
		toReturn += this.ifMatchsGet("20|01|11", key, 40);
		toReturn -= this.ifDontMatchsGet("20|01|11", key, 40);

		toReturn += this.ifMatchsGet("201|011",key,80);
		toReturn -= this.ifDontMatchsGet("201|011",key,20);
		
		toReturn += this.ifMatchsGet("2011", key, 200);
		
		return toReturn;
	}
	
	public ArrayList<String> detalleDelPuntajePorNumerosContenidos(String key) {
		ArrayList<String> result = new ArrayList<String>();
		
		result.add(this.ifMatchsGet("2|1|0",key,20) == 0 ? 
				"El cromosoma no contiene ni el 2,ni el 1, ni el 0, y se penaliza con un valor de 80" 
				: "El cromosoma contiene alguno de los siguientes digitos: 2,1 o 0, entonces se premia con un valor de 20");
		
		result.add(this.ifMatchsGet("20|01|11",key,20) == 0 ? 
				"El cromosoma no contiene ni el 20, ni el 01, ni el 11, y se penaliza con un valor de 40" 
				: "El cromosoma contiene alguno de los siguientes digitos: 20,01 o 11, entonces se premia con un valor de 40");
		
		result.add(this.ifMatchsGet("201|011",key,20) == 0 ? 
				"El cromosoma no contiene ni el 201, ni el 011, y se penaliza con un valor de 20" 
				: "El cromosoma contiene alguno de los siguientes digitos: 201, 011 entonces se premia con un valor de 80");

		if (this.ifMatchsGet("2011",key,20) != 0){
			result.add("El cromosoma contiene la subcadena 2011, entonces se premia con un valor de 200");
		}

		
		return result;
	}


	private double ifMatchsGet(String pat,String key,double value){
		if(Pattern.compile(pat).matcher(key).find()){
			return value;
		}
		return 0;
	}
	
	private double ifDontMatchsGet(String pat,String key,double value){
		if(!Pattern.compile(pat).matcher(key).find()){
			return value;
		}
		return 0;
	}

	@Override
	public String getLiteralDefinition() {
		return "El resultado debe contener la secuencia '2011' en alguna parte de la cadena.";
	}

}
